package reflectionAndAnnotation.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author zxl
 * @version 1.0
 * @date 2021/10/24 15:35
 * 通过反射使用对象的方法
 */
public class Method {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获得class对象
        Class<?> aClass = Class.forName("reflectionAndAnnotation.reflection.model.User");

        //获得所有方法  公共 (包括继承的)
        java.lang.reflect.Method[] methods = aClass.getMethods();
        for (java.lang.reflect.Method method : methods) {
            System.out.println(method);
        }
        System.out.println();
        //全部（不包含继承的）
        java.lang.reflect.Method[] declaredMethods = aClass.getDeclaredMethods();
        for (java.lang.reflect.Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println();

        //获得单个方法 公共
        java.lang.reflect.Method method = aClass.getMethod("getNames", String.class);
        //获得构造方法创建对象
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();
        //通过对象调用getNames方法
        method.invoke(o,"周");

        //私有
        java.lang.reflect.Method declaredMethod = aClass.getDeclaredMethod("getIds");
        //关闭检查
        declaredMethod.setAccessible(true);
        declaredMethod.invoke(o);
    }
}
